import os
import re
from typing import List, Tuple

# --- 配置区 START ---
# 1. 根目录：从哪里开始搜索你的项目
# !!! 请替换成你的项目实际路径 !!!
PROJECT_ROOT = "/Users/hanrong.zheng/Projects/oraimo-android"  # 假设在项目根目录运行

# 2. 目标文件模式：支持多种目录和文件后缀。
# 'layout/**/*.xml' 查找所有layout目录及其子目录下的xml文件
# 'src/main/java/**/*.java' 查找所有java源文件
TARGET_PATTERNS = [
    "**/layout/*.xml",
]
    # "**/src/main/java/**/*.java"

# 3. 匹配模式：使用原始字符串 (r"...") 来定义，防止反斜杠转义问题
SEARCH_PATTERN = r'#[a-fA-F0-9]{3}'  # 示例：匹配Java/Kotlin代码中的旧字符串引用
# SEARCH_PATTERN = r'="#ffffff"'  # 示例：匹配Java/Kotlin代码中的旧字符串引用

# 4. 替换文本：用于替换匹配项的新文本
REPLACEMENT_TEXT = r'="@color/white"'  # 示例：替换为新的字符串引用

# 5. 操作模式：True = 执行替换；False = 仅查找和预览 (推荐)
EXECUTE_REPLACEMENT = False


# --- 配置区 END ---


from pathlib import Path


def find_files_accurate(root: str, patterns: List[str]) -> List[str]:
    """
    使用 pathlib.Path.glob 实现精确的、支持递归通配符 (**) 的文件查找。
    """
    project_path = Path(root)
    file_list = []

    for pattern in patterns:
        print(pattern)
        # Path.glob(pattern) 会正确处理 'src/main/java/**/*.java'
        # 它只会返回位于 'src/main/java' 及其子目录下的 .java 文件
        file_list.extend([str(f) for f in project_path.glob(pattern) if f.is_file()])

    # 去重
    return list(set(file_list))


# 示例：
# patterns = ["layout/**/*.xml", "src/main/java/**/*.java"]
# files = find_files_accurate(".", patterns)
# print(files)


def process_file(filepath: str, pattern: str, replacement: str, execute_replace: bool) -> bool:
    """
    处理单个文件，查找匹配项，并可选地执行替换。
    """
    #print(f"\n--- 正在处理: {filepath} ---")

    try:
        with open(filepath, 'r', encoding='utf-8') as f:
            content = f.readlines()
    except Exception as e:
        print(f"!!! 无法读取文件 {filepath}: {e}")
        return False

    modified_content = []
    has_match = False

    for line_num, line in enumerate(content, 1):
        if re.search(pattern, line):
            has_match = True

            # 输出当前行信息
            print(f"  [第 {line_num} 行] 找到匹配项:")
            print(f"    > 原始行: {line.strip()}")

            # 预览或执行替换
            if execute_replace:
                new_line = re.sub(pattern, replacement, line)
                print(f"    > 替换后: {new_line.strip()}")
                modified_content.append(new_line)
            else:
                # 仅预览，不写入
                modified_content.append(line)
        else:
            modified_content.append(line)

    if has_match and execute_replace:
        # 执行替换操作：写入文件
        try:
            print(f"\n*** 写入更改到文件: {filepath} ***")
            with open(filepath, 'w', encoding='utf-8') as f:
                f.writelines(modified_content)
            return True
        except Exception as e:
            print(f"!!! 无法写入文件 {filepath}: {e}")
            return False

    return has_match


def main():
    """主函数"""
    print("--- Android 项目文本搜索与替换脚本 ---")
    print(f"目标路径: {PROJECT_ROOT}")
    print(f"文件模式: {TARGET_PATTERNS}")
    print(f"搜索模式: {SEARCH_PATTERN}")
    print(f"操作模式: {'执行替换' if EXECUTE_REPLACEMENT else '仅查找 (安全模式)'}")
    print("---------------------------------------")

    # 1. 查找文件
    try:
        target_files = find_files_accurate(PROJECT_ROOT, TARGET_PATTERNS)
        print(f"✅ 找到 {len(target_files)} 个匹配的文件。")
        if not target_files:
            return
    except Exception as e:
        print(f"!!! 文件查找失败: {e}")
        return

    # 2. 遍历处理文件
    changed_count = 0
    for filepath in target_files:
        if process_file(filepath, SEARCH_PATTERN, REPLACEMENT_TEXT, EXECUTE_REPLACEMENT):
            changed_count += 1

    # 3. 结果总结
    print("\n====================================")
    if EXECUTE_REPLACEMENT:
        print(f"🎉 总结: 已成功在 {changed_count} 个文件中执行替换操作。")
    else:
        print(f"🔍 总结: 在 {changed_count} 个文件中找到了匹配项 (未执行写入)。")
    print("====================================")


if __name__ == "__main__":
    main()